/*
 * @Title:  TableModule.java   
 * @Package com.shelai.mybatis.table   
 * @Description:    TODO(用一句话描述该文件做什么)   
 * @author: 李凯     
 * @date:   2018年6月13日 下午11:23:41   
 * @version V1.0 
 */
package com.frames.table.module;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.supers.pojo.Table;
import com.utils.transtype.JsonObjectUtil;

/*  
 * @ClassName:  TableModule   
 * @Description:   单表增删改查
 * @author: 李凯
 * @date:   2018年6月13日 下午11:23:41   
 *     
 */
@Deprecated
public interface TableModule {
	<T> int add(@Param("bean") T bean);// 添加数据

	<T> int batchAdd(@Param("beans") List<T> beans);// 批量添加数据

	<T> int delete(@Param("bean") T bean);// 删除数据

	<T> int batchDeleteById(@Param("ids") int[] ids, @Param("bean") T bean);// 根据id批量删除数据

	<T> int updateById(@Param("bean") T bean);// 根据id修改数据

	<T> int updateByCondition(@Param("cols") T cols, @Param("condtions") T condtions);// 根据条件修改数据,cols需要修改的列，condtions条件

	<T> int batchUpdateById(@Param("beans") List<T> beans);// 根据id批量更新数据
	
	<T> int batchUpdateByUniqueCol(@Param("beans") List<T> beans,@Param("uniqueCol")String uniqueCol);// 根据指定唯一键更新数据,uniqueCol为驼峰式

	<T> int getCount(@Param("bean") T bean);// 获取数据总数
	
	<T> int intSum(@Param("col") String col,@Param("bean") T bean);// 整数求和,col驼峰式
	
	<T> double doubleSum(@Param("col") String col,@Param("bean") T bean);// double求和col驼峰式

	<T> Map<String, Object> slelectOne(@Param("bean") T bean);// 获取一条数据

	<T> List<Map<String, Object>> selectList(@Param("bean") T bean);// 获取多条数据
	
	// 获取一条数据
	@SuppressWarnings("unchecked")
	default <T> T getOne(T bean) throws Exception {
		Map<String, Object> data = slelectOne(bean);
		if (bean instanceof Map) {
			return (T) data;
		} else {
			return (T) JsonObjectUtil.ALWAYS.mapToObject(data, bean.getClass());
		}
	}

	// 获取多条数据不分页
	@SuppressWarnings("unchecked")
	default <T> List<T> getList(T bean) throws Exception {
		List<Map<String, Object>> data = selectList(bean);
		if (bean instanceof Map) {
			return (List<T>) data;
		} else {
			String jsonList=JsonObjectUtil.ALWAYS.objectToJson(data);
			return (List<T>) JsonObjectUtil.ALWAYS.jsonToObjectList(jsonList,bean.getClass());
		}
	}
	
	// 获取分页多条数据,返回对象集合
	@SuppressWarnings("unchecked")
	default <T> PageInfo<T> getPageList(T bean) throws Exception {
		Table table=(Table) bean;
		PageHelper.startPage(table.getPageNum(), table.getPageSize());// 设置分页，pageSize=0则不会分页
		List<Map<String, Object>> data = selectList(bean);
		PageInfo<Map<String, Object>> page=new PageInfo<>(data);
		if (bean instanceof Map) {
			return (PageInfo<T>) page;
		} else {
			String jsonList=JsonObjectUtil.ALWAYS.objectToJson(data);
			List<T> beanList=(List<T>) JsonObjectUtil.ALWAYS.jsonToObjectList(jsonList,bean.getClass());
			String pageJson=JsonObjectUtil.ALWAYS.objectToJson(page);
			PageInfo<T> pageInfo=(PageInfo<T>) JsonObjectUtil.ALWAYS.jsonToObject(pageJson,PageInfo.class);
			pageInfo.setList(beanList);
			return pageInfo;
		}
	}
	
	// 获取分页多条数据,返回map数据集合
	default PageInfo<Map<String, Object>> getPageListMap(Table table) throws Exception {
		PageHelper.startPage(table.getPageNum(), table.getPageSize());// 设置分页，pageSize=0则不会分页
		List<Map<String, Object>> data = selectList(table);
		PageInfo<Map<String, Object>> page=new PageInfo<>(data);
		return page;		
	}
}
